package com.principles.behavior.iterator;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description 迭代器模式：让你能在不暴露集合底层表现形式（列表、栈和树）的情况下遍历集合中的所有元素。
 * @Date 2025/1/30 21:53
 **/
public class IteratorPattern {
    public static void main(String[] args) {
        CompanyAggregate companyAggregate = new CompanyAggregateImpl();
        companyAggregate.add("信息科技部");
        companyAggregate.add("创新业务部");
        companyAggregate.add("行政部");
        companyAggregate.add("财务部");
        /**
         * 遍历
         * 在遍历的过程中iterator.next() 我们并不关心是集合内部是什么类型
         */
        CompanyIterator iterator = companyAggregate.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }

    }
}

/**
 * 抽象聚合（Aggregate）角色 : 公司
 */
interface CompanyAggregate {

    /**
     * 增加部门
     *
     * @param obj
     */
    public void add(Object obj);

    /**
     * 删除部门
     *
     * @param obj
     */
    public void remove(Object obj);

    /**
     * 获取一个具体的迭代器
     *
     * @return
     */
    public CompanyIterator iterator();

}

/**
 * 具体聚合（Concrete Aggregate）角色 : 公司的行为实现
 */
class CompanyAggregateImpl implements CompanyAggregate {

    /**
     * 持有一个存储集合数据的对象
     */
    private List<Object> list;

    public CompanyAggregateImpl() {
        this.list = new ArrayList<>();
    }

    @Override
    public void add(Object obj) {
        list.add(obj);
    }

    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }

    /**
     * 返回一个具体迭代器的实例  CompanyIterator
     * 集合对象将自身传递给迭代器的构造函数来创建两者之间的链接。
     *
     * @return
     */
    @Override
    public CompanyIterator iterator() {
        return new CompanyConcreteIterator(list);
    }
}

/**
 * 抽象迭代器（Iterator）角色 : 公司迭代器
 */
interface CompanyIterator {

    /**
     * 获取第一个元素
     *
     * @return
     */
    Object first();

    /**
     * 获取下一个元素
     *
     * @return
     */
    Object next();

    /**
     * 判断是否还有下一个元素，没有则遍历结束
     *
     * @return
     */
    boolean hasNext();

}

/**
 * 具体迭代器（Concrete iterator）角色  公司迭代器的具体实现
 */
class CompanyConcreteIterator implements CompanyIterator {

    /**
     * 记录遍历的当前位置
     */
    private int index;
    /**
     * 通过迭代器的构造函数建立迭代器对象与单个集合实体链接
     */
    private List<Object> list;

    public CompanyConcreteIterator(List<Object> list) {
        this.list = list;
        this.index = 0;
    }

    @Override
    public Object first() {
        return list.get(0);
    }

    @Override
    public Object next() {
        Object o = list.get(index);
        index++;
        return o;
    }

    @Override
    public boolean hasNext() {
        return index < list.size();
    }
}
